/*
 * File:   User.h
 * Author: wilq
 *
 * Created on June 6, 2012, 8:46 PM
 */

#ifndef PATH_INFO_H
#define	PATH_INFO_H
#include <string>
#include "config.h"
namespace CSDatabaseLib {
	/**
	 * Enum opisujący typ ścieżki.
	 */
	typedef enum
	{
			PATH_UNKNOWN,
			PATH_FILE,
			PATH_FOLDER
	} EPathType;

	class DataBase;

	/**
	 * Klasa opisująca ścieżke, używana do dokompozycji jej.
	 */
	class PathInfo
	{
		friend class DataBase;
		private:
			uint32_t m_id, m_rights, m_owner, m_group;
			std::string m_name, m_link, m_path;
			uint32_t m_storage_id;
			EPathType m_type;
			PathInfo* m_parent;
			PathInfo* m_child;
			bool m_exists;
			bool m_terminated;
			uint64_t m_syncTime, m_modTime, m_Time;
			PathInfo(PathInfo *parent, const std::string &name);

		public:
			/** Metoda zwraca ID zasobu */
			inline uint32_t GetId() const { return m_id; }
			/** Metoda zwraca uprawnienia zasobu */
			inline uint32_t GetRights() const { return m_rights; }
			/** Metoda zwraca identyfikator właściciela zasobu */
			inline uint32_t GetOwner() const { return m_owner; }
			/** Metoda zwraca idnetyfikator grupy zasoby */
			inline uint32_t GetGroup() const { return m_group; }
			/** Metoda zwraca identyfikattor storage który udostępnia ten zasób */
			inline uint32_t GetStorageId() const { return m_storage_id; }
			/** Metoda sprawdza czy zasób istnieje */
			inline bool IsExists() const { return m_exists; }
			/** Metoda sprawdza czy zasób może wskazywać na folder */
			inline bool IsTerminated() const { return !m_path.empty() && m_path[m_path.length()-1] == '/'; }
			/** Metoda sprawdza czy zasób jest bezpośrednim dzieckiem nadrzędnego zasobu */
			bool IsDirectStorageChild() const;
			/** Metoda zwraca typ ścieżki do zasobu */
			inline EPathType GetType() const { return m_child!=NULL ? PATH_FOLDER : m_type; }
			/** Metoda zwraca nazwę zasobu */
			inline const std::string &GetName() const { return m_name; }
			/** Metoda zwraca link lokalny do zasobu */
			inline const std::string &GetLink() const { return m_link; }
			/** Metoda zwraca wirtualną ścieżkę do zasobu */
			inline const std::string &GetPath() const { return m_path; }
			/** Metoda zwraca parent zasób */
			inline PathInfo* GetParent() const { return m_parent; }
			/** Metoda zwraca child zasób */
			inline PathInfo* GetChild() const { return m_child; }
			/** Metoda zwraca czas ostatniej synchronizacji zasobu */
			inline uint64_t GetSyncTime() const { return m_syncTime; }
			/** Metoda dla folderów zwraca czas ostatniej synchronizacji zawartości folderu */
			inline uint64_t GetListTime() const { return m_modTime; }
			/** Metoda zwraca aktualny czas */
            inline uint64_t GetTime() const { return m_Time; }
			/** Metoda sprawdza czy folder jest czysto wirtualny */
            inline bool IsVirtual() const { return 0 == m_storage_id || m_link.empty(); }
			/** Destruktor domyślny usuwa informacje o zasobie i powiązanych zasobach */
			~PathInfo();
	};
};
#endif	/* PATH_INFO_H */

